C.S.M.P. Digest Sat, 30 Jan 93 Volume 2 : Issue 7 Today's Topics: Problem with patch to HFSDispatch How do I find a hole in the DeskTop?! Volume icons? Suppl. Gestalt Selectors List 1.2 The Comp.Sys.Mac.Programmer Digest is moderated by Michael A. Kelly. The digest is a collection of article threads from the internet newsgroup comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi- regularly and want an archive of the discussions. If you don't know what a newsgroup is, you probably don't have access to it. Ask your systems administrator(s) for details. If you don't have access to news, there is no way that I know of for you to post articles to the group. Each issue of the digest contains one or more sets of articles (called threads), with each set corresponding to a 'discussion' of a particular subject. The articles are not edited; all articles included in this digest are in their original posted form (as received by our news server at cs.uoregon.edu). Article threads are not added to the digest until the last article added to the thread is at least one month old (this is to ensure that the thread is dead before adding it to the digest). Article threads that consist of only one message are generally not included in the digest. The entire digest is available for anonymous ftp from ftp.cs.uoregon.edu [128.223.8.8] in the directory /pub/mac/csmp-digest. Be sure to read the file /pub/mac/csmp-digest/README before downloading any files. The most recent issues are available from sumex-aim.stanford.edu [36.44.0.6] in the directory /info-mac/digest/csmp. If you don't have ftp capability, the sumex archive has a mail server; send a message with the text '$MACarch help' (no quotes) to LISTSERV@ricevm1.rice.edu for more information. The digest is also available via email. Just send a note saying that you want to be on the digest mailing list to mkelly@cs.uoregon.edu, and you will automatically receive each new issue as it is created. Sorry, back issues are not available through the mailing list. Send administrative mail to mkelly@cs.uoregon.edu. ------------------------------------------------------- From: rmah@panix.com (Robert Mah) Subject: Problem with patch to HFSDispatch Date: 22 Dec 92 18:27:10 GMT Organization: PANIX Public Access Unix, NYC In an extension that works fine on most systems, but some people seem to be getting freezes when they shut down/restart their machine. I'm not sure, but I think it might be related to my patching HFSDispatch. I'm using register a1 to hold the adress of the real trap -- is there something wrong with this? Anyone care to comment? Some code... /* * We need to trap whenever the user moves a directory (selector 5). */ pascal void FSDispatchPatch() { asm{ movem.l a4, -(sp) ; save registers lea main, a4 ; setup globals cmp.w #5, d0 ; if not CatMove bne.s @1 move.w #1, gNeedsUpdate ; set the gNeedsUpdate flag @1 move.l realHFSDispatchTrap, a1 ; grab the addr of the real thing movem.l (sp)+, a4 ; restore registers jmp (a1) ; jump to real HFSDispatch } } Happy Holdiays, Rob - -- [--------------------------------------------------] [ Robert S. Mah | "Every day an adventure, ] [ rmah@panix.com | every moment a challenge." ] [--------------------------------------------------] +++++++++++++++++++++++++++ From: leonardr@netcom.com (Leonard Rosenthol) Date: 23 Dec 92 00:30:46 GMT Organization: Netcom Online Communications Services (408-241-9760 login: guest) In article <1992Dec22.182710.26751@panix.com> rmah@panix.com (Robert Mah) writes: >In an extension that works fine on most systems, but some people seem to >be getting freezes when they shut down/restart their machine. I'm not >sure, but I think it might be related to my patching HFSDispatch. > >I'm using register a1 to hold the adress of the real trap -- is there >something wrong with this? Anyone care to comment? > Yup, that's your problem. A1 & A2 are "special" for the HFSDispatch routine and "may" contain useful information. Using A3 should work just fine. - -- - ----------------------------------------------------------------------------- Leonard Rosenthol Internet: leonardr@netcom.com Director of Advanced Technology AppleLink: MACgician Aladdin Systems, Inc. GEnie: MACgician +++++++++++++++++++++++++++ From: absurd@apple.apple.com (Tim Dierks, software saboteur) Date: 23 Dec 92 03:10:35 GMT Organization: MacDTS Marauders In article <1992Dec22.182710.26751@panix.com>, rmah@panix.com (Robert Mah) wrote: > > In an extension that works fine on most systems, but some people seem to > be getting freezes when they shut down/restart their machine. I'm not > sure, but I think it might be related to my patching HFSDispatch. > > I'm using register a1 to hold the adress of the real trap -- is there > something wrong with this? Anyone care to comment? > > Some code... > > /* > * We need to trap whenever the user moves a directory (selector 5). > */ > pascal void FSDispatchPatch() > { > asm{ > movem.l a4, -(sp) ; save registers > lea main, a4 ; setup globals > cmp.w #5, d0 ; if not CatMove > bne.s @1 > move.w #1, gNeedsUpdate ; set the gNeedsUpdate flag > @1 move.l realHFSDispatchTrap, a1 ; grab the addr of the real thing > movem.l (sp)+, a4 ; restore registers > jmp (a1) ; jump to real HFSDispatch > } > } Your problem is that you're destroying A1; it's used as a parameter by some HFSDispatch selectors. While you could do this by trashing a different register, which isn't used, you could always use the slightly more complex but somewhat more clever method. clr.l -(sp) ; save room for forwarding address > movem.l a4, -(sp) ; save registers > lea main, a4 ; setup globals > cmp.w #5, d0 ; if not CatMove > bne.s @1 > move.w #1, gNeedsUpdate ; set the gNeedsUpdate flag @1 move.l realHFSDispatchTrap,4(a7) ; store forwarding address on stack > movem.l (sp)+, a4 ; restore registers rts ; jump to real HFSDispatch Note that this preserves all the registers by using the trick of using an RTS to pop the jump address off of the stack, allowing you to restore all your registers first. (Well, I always thought it was neat, anyway.) Have a great holiday, one and all- I'm off to home till Jan 6; I'll be gone (netwise) till then. Tim Dierks MacDTS pinball addict +++++++++++++++++++++++++++ From: d88-jwa@hemul.nada.kth.se (Jon Wtte) Date: 23 Dec 92 11:05:45 GMT Organization: Royal Institute of Technology, Stockholm, Sweden In <1992Dec22.182710.26751@panix.com> rmah@panix.com (Robert Mah) writes: >I'm using register a1 to hold the adress of the real trap -- is there >something wrong with this? Anyone care to comment? >@1 move.l realHFSDispatchTrap, a1 ; grab the addr of the real thing > movem.l (sp)+, a4 ; restore registers > jmp (a1) ; jump to real HFSDispatch Yes, this trashes register a1. Instead, you should "reserve space" on the stack for the chain address, save the registers, do your thing, put the registers back into shape and RTS _to_the_next_routine_. Something like: subq #4, a7 movem.l a1/a4, -(a7) ... do stuff ... move.l realHFSDispatchTrap, a1 move.l a1, 8(a7) movem.l (a7)+, a1/a4 rts Note that this _IS_ a head patch, since the "RTS" actually is used as a jump to the next function, leaving stack and registers intact. Cheers, / h+ - -- -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe -- "It was, in fact, cool as all get-out. Fortunately it was a little too late (historically speaking) to be groovy." -- Dennis Pelton +++++++++++++++++++++++++++ From: rmah@panix.com (Robert Mah) Date: 28 Dec 92 02:25:59 GMT Organization: PANIX Public Access Unix, NYC In absurd@apple.apple.com (Tim Dierks, software saboteur) writes: >Your problem is that you're destroying A1; it's used as a parameter by >some HFSDispatch selectors. >While you could do this by trashing a different register, which isn't >used, you could always use the slightly more complex but somewhat more >clever method. > clr.l -(sp) ; save room for forwarding address >> movem.l a4, -(sp) ; save registers >> lea main, a4 ; setup globals >> cmp.w #5, d0 ; if not CatMove >> bne.s @1 >> move.w #1, gNeedsUpdate ; set the gNeedsUpdate flag >> @1 move.l realHFSDispatchTrap,4(a7) ; store forwarding address on stack >> movem.l (sp)+, a4 ; restore registers > rts ; jump to real HFSDispatch >Note that this preserves all the registers by using the trick of using >an RTS to pop the jump address off of the stack, allowing you to restore >all your registers first. Thanks I'll try it and see how it works. But won't changing the return address mess up some toolbox things. I seem to recall that that was why "tail patches" were not allowed -- of course, I could be totally confused here :-> Thanks again, Rob - -- [--------------------------------------------------] [ Robert S. Mah | "Every day an adventure, ] [ rmah@panix.com | every moment a challenge." ] [--------------------------------------------------] +++++++++++++++++++++++++++ From: rmah@panix.com (Robert Mah) Date: 28 Dec 92 02:28:01 GMT Organization: PANIX Public Access Unix, NYC Jon, Thanks a bunch. Also clears up a question I had regarding return addresses that I asked Tim Dierks about in his reply. Cool runnin' Rob - -- [--------------------------------------------------] [ Robert S. Mah | "Every day an adventure, ] [ rmah@panix.com | every moment a challenge." ] [--------------------------------------------------] +++++++++++++++++++++++++++ From: d88-jwa@dront.nada.kth.se (Jon Wtte) Date: 28 Dec 92 10:41:04 GMT Organization: Royal Institute of Technology, Stockholm, Sweden In <1992Dec28.022559.2496@panix.com> rmah@panix.com (Robert Mah) writes: >Thanks I'll try it and see how it works. But won't changing the return >address mess up some toolbox things. I seem to recall that that was why >"tail patches" were not allowed -- of course, I could be totally confused >here :-> But that's the beauty of it; we DON'T change the normal return address. The stack will look a little like: Return Address Then we push the address to chain to: Return Address Chain Address and restore registers and do an RTS: Return Address The stack looks JUST like it did on entry to our routine! The patch has preserved all registers and the original return address, so it isn't a tail patch and it isn't zapping any registers; it's clean. - -- -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe -- "From now on I will re-label the EQ on the deck as Fizz and Wobble instead of HF and LF." --------------------------- From: yjc@po.cwru.edu (Jerome 'TofuSoft' Chan) Subject: How do I find a hole in the DeskTop?! Date: 25 Dec 1992 06:29:04 GMT Organization: The Tofu Society of Singapore How do I find a clear section of the desktop which is NOT covered by Windows?! I've want my clock application window to slowly creep to the nearest uncovered region on the desktop. - --- The Evil Tofu +++++++++++++++++++++++++++ From: grobbins@Apple.COM (Grobbins) Date: 27 Dec 92 01:02:48 GMT Organization: Apple Computer Inc, Cupertino, CA In article yjc@po.cwru.edu (Jerome 'TofuSoft' Chan) writes: >How do I find a clear section of the desktop which is NOT covered by >Windows?! I've want my clock application window to slowly creep to the >nearest uncovered region on the desktop. Hmm. Well, one way would be to make certain that your application is the backmost and open a window which covers the whole desktop (the same size as the gray rgn bounding box.) Then the visRgn of that window would be all of the desktop area minus all of the open windows of all applications. Making your application the backmost would be a small pain, and opening a window which covers the whole screen would make an ugly flash, so that's not a good solution. Besides, you would either have to keep the window open and visible or else reopen it periodically to keep monitoring its visRgn. A more promising solution is to use the visRgn of the System 7 Finder's Desktop window, since that region also reflects the whole screen minus any open windows (including your app's open window). There's no documented way to get the WindowPtr to the Desktop window, however, though doing something like patching OpenWindow or GetNewWindow at INIT time would probably work. The window is named Desktop, though there is no guarantee that the Finder window list won't have other windows coincidentally named Desktop, so checking its bounds against the the real desktop (grayrgn) bounds is probably a good idea to makesure you've gotten the right window. Good luck. Grobbins grobbins@apple.com +++++++++++++++++++++++++++ From: rmah@panix.com (Robert Mah) Date: 28 Dec 92 02:40:44 GMT Organization: PANIX Public Access Unix, NYC In yjc@po.cwru.edu (Jerome 'TofuSoft' Chan) writes: >How do I find a clear section of the desktop which is NOT covered by >Windows?! I've want my clock application window to slowly creep to the >nearest uncovered region on the desktop. GREAT IDEA. I'm gonna use it too, if you don't mind. Anyway, you just gotta look at the structure regions of all the windows that are visible. Each application keeps a list of windows starting at the global WindowList. The only problem is to get WindowList for each application. One possible way is to patch InitWindows and grab that app's WindowList global. Don't forget to patch ExitToShell to catch the application's quitting. Another option is to track all window creation, deletion, hiding and showing. On second thought, does GrayRgn hold the VISIBLE desktop or the whole thing? Not sure on this...but a little experimentation should clear it up. Cheers, Rob - -- [--------------------------------------------------] [ Robert S. Mah | "Every day an adventure, ] [ rmah@panix.com | every moment a challenge." ] [--------------------------------------------------] +++++++++++++++++++++++++++ From: phaedrus@halcyon.com (Mark Phaedrus) Date: 28 Dec 92 05:26:51 GMT Organization: The 23:00 News and Mail Service In article <1992Dec28.024044.3652@panix.com> rmah@panix.com (Robert Mah) writes: >In yjc@po.cwru.edu (Jerome 'TofuSoft' Chan) writes: >>How do I find a clear section of the desktop which is NOT covered by >>Windows?! I've want my clock application window to slowly creep to the >>nearest uncovered region on the desktop. >GREAT IDEA. I'm gonna use it too, if you don't mind. I'm not sure that this is such a good idea. The user is always supposed to be in control of the Mac interface. When I put a window somewhere on my screen, it means that I've decided that that's a perfectly fine place for that window, and I would just assume it didn't try to crawl somewhere else on its own, thank you very much. :) If you do decide to do this, be sure to make it user-configurable. And while you're making it user-configurable, add the option to make the window just teleport to a clear location, rather than "creeping" there. Even if I wanted this feature, I'm not sure that I'd want a background application like a clock using up the CPU time required to slowly move its window across the screen. - -- \o\ Internet: phaedrus@halcyon.com (Seattle, WA Public Access Unix) \o\ \o\ "How'd you like to move a few steps down the food chain, pal?" \o\ \o\ If you enjoy fantasy/SF stories with transformation themes, email me \o\ \o\ for a copy of the Transformation Stories List. \o\ +++++++++++++++++++++++++++ From: yjc@po.cwru.edu (Jerome 'TofuSoft' Chan) Date: 28 Dec 92 19:19:03 GMT Organization: The Tofu Society of Singapore In article <1992Dec28.024044.3652@panix.com>, rmah@panix.com (Robert Mah) wrote: > GREAT IDEA. I'm gonna use it too, if you don't mind. Please go ahead and use it. Maybe someone could put up a window behind such a hole and do neat little animations, like maybe a cartoon of the talking moose playing chess with the dogcow. :) - --- The Evil Tofu --------------------------- From: UC525655@mizzou1.missouri.edu (Mark Eaton) Subject: Volume icons? Date: 20 Dec 92 22:41:12 GMT Organization: University of Missouri Hi all- Where can i find the icon definition for a mounted volume? I have looked through all the (I think) relevant material in IM I-VI, but obviously I've missed something somewhere, but all IM talks about are file icons. Help! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mark Eaton | Opinions? We're not allowed to have UC525655@MIZZOU1.MISSOURI.EDU | opinions at Mizzou... get back to me | in '94 when I graduate... ;) +++++++++++++++++++++++++++ From: jacman@magicbb.uucp (Jordan Christensen) Date: 22 Dec 92 12:32:28 GMT Organization: MAGIC - Macintosh Awareness Group In Canada >Hi all- >Where can i find the icon definition for a mounted volume? >I have looked through all the (I think) relevant material in >IM I-VI, but obviously I've missed something somewhere, but all >IM talks about are file icons. Help! The volume icons are stored in an invisible file called 'Icon' in the root directory, it's id is (not sure of this) '-16455'. Hoped This Helped +++++++++++++++++++++++++++ From: dmitry@chemistry.chem.utah.edu (Dmitry Boldyrev) Date: 29 Dec 92 18:39:56 GMT Organization: University of Utah >Hi all- >Where can i find the icon definition for a mounted volume? >I have looked through all the (I think) relevant material in >IM I-VI, but obviously I've missed something somewhere, but all >IM talks about are file icons. Help! > > >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >Mark Eaton | Opinions? We're not allowed to have >UC525655@MIZZOU1.MISSOURI.EDU | opinions at Mizzou... get back to me > | in '94 when I graduate... ;) Hello Mark, Here, I have smth for you... ============================ CUT HERE ============================ /* this is the data structure pointed to in the result of the disk driver call csCode=21 (get ICN#/comment). This call works on all devices. */ typedef struct TInfoBlk { unsigned char icon[128]; /* icon */ unsigned char mask[128]; /* mask */ Str255 infoString; /* info string (for get info) */ } TInfoBlk,*TInfoPtr; void GetDiskInfo(short driverRefNum,short driveNum,TInfoPtr *dataBlk); void DrawInfo(TInfoPtr infoBlock); void GetAllInfo(void); void GetAllInfoYourWay(void); void main(void) { WindowPtr theWindow; Rect wBounds; #ifdef THINK_C InitGraf(&thePort); #else InitGraf(&qd.thePort); #endif InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(nil); FlushEvents(everyEvent,0); InitCursor(); SetRect(&wBounds,40,40,100,100); theWindow = NewWindow (nil,&wBounds,(StringPtr)"\pIcons",true,documentProc, (WindowPtr)(-1),true,0L); SetPort(theWindow); GetAllInfo(); DisposeWindow(theWindow); } /* This routine traverses the currently mounted volumes index using PBHGetVInfo(). The drive # and device driver number for each volume is extracted from the parameter block, and passed into GetDiskInfo() to call the disk drivers. Once the data has been retrieved, the icon is plotted */ void GetAllInfo(void) { HParamBlockRec vBlock; /* volume parameter block used to traverse mounted vols */ OSErr err; TInfoPtr dataBlk; /* pointer used to point to result of csCode=21 call */ vBlock.volumeParam.ioNamePtr = nil; vBlock.volumeParam.ioVRefNum = 0; vBlock.volumeParam.ioVolIndex = 1; do { err = PBHGetVInfo (&vBlock,false); vBlock.volumeParam.ioVolIndex++; if (err==noErr) { GetDiskInfo(vBlock.volumeParam.ioVDRefNum, vBlock.volumeParam.ioVDrvInfo,&dataBlk); if (dataBlk) DrawInfo(dataBlk); } } while (err==noErr); } /* GetDiskInfo() makes the call to the volume's driver to get the volume icon and info string. A pointer to this data is returned by reference in dataBlk This routine tries to call the disk's driver with csCode=22, which attempts to get info on a specific physical volume. If the csCode=22 call fails, I call csCode=21 to get the generalized media icon. Both calls are documented in IM V-470 */ void GetDiskInfo(short driverRefNum,short driveNum,TInfoPtr *dataBlk) { CntrlParam pBlock; OSErr err; pBlock.ioVRefNum = driveNum; pBlock.ioCRefNum = driverRefNum; pBlock.csCode = 22; err = PBControl(&pBlock,false); if (err==controlErr) { pBlock.ioVRefNum = driveNum; pBlock.ioCRefNum = driverRefNum; pBlock.csCode = 21; err = PBControl(&pBlock,false); } if (err==noErr) *dataBlk = (TInfoPtr) *(Ptr *)pBlock.csParam; /* messy way to get the locn out */ else *dataBlk = nil; } /* this routine uses CopyBits to draw the icon on the screen (ignoring the mask and the info string). Make sure you put up a window and call SetPort() first! */ void DrawInfo(TInfoPtr infoBlock) { BitMap iconMap; Rect destRect; iconMap.baseAddr = (Ptr)infoBlock; iconMap.rowBytes = 4; SetRect(&iconMap.bounds,0,0,32,32); SetRect(&destRect,0,0,32,32); OffsetRect(&destRect,10,10); CopyBits(&iconMap,&thePort->portBits,&iconMap.bounds,&destRect, srcCopy,nil); while (!Button()); while (Button()); } ============================ CUT HERE ============================ Guess, it make sense.. ................................................. Dmitry Boldyrev, Department of Chemistry, University of Utah. Internet: dmitry@chemistry.chem.utah.edu -- "I only know that I know nothing" - Socrates --------------------------- From: rgaros@bio.vu.nl (Rene G.A. Ros) Subject: Suppl. Gestalt Selectors List 1.2 Organization: VU Biology, Amsterdam, The Netherlands Date: Tue, 1 Dec 1992 12:10:58 GMT Archive-name: gestalt-list Last Modified: 1992/11/30 Version: 1.2 Supplemental Gestalt Selectors List 1.2 ======================================= Last modified: November 30, 1992, 21:50 CET (GMT+1) Supplemental to the selector codes listed in the Gestalt Chapter of Inside Macintosh VI (IM VI), that is. These can include selector codes installed by Apple's (system) software or by software from third parties (your software?). (NIM Operating System Utilities has been delayed from Winter 1992 to June 1993, according to Addison-Wesley Holland). I don't have all the documentation or knowledge and I don't want to. I would like to see this list to become a combined effort by different persons who have together access to a wide area of information. This list may contain (educated) guesses and perhaps even false information, so no guarantee is made about the contents. You can use this information freely, but when you find information not included in IM VI or in this list; please mail it me. If you have additions, corrections, comments, suggestions, news about available software, etc., please mail me. Please, also mention the source you used. For ways to contact me, see the end of this list. This list is originally distributed in the following ways: USENET newsgroup comp.sys.mac.programmer (c.s.m.p.) I will post every new version of the list to c.s.m.p., but the last version will be reposted once a month. FTP-site sumex-aim.stanford.edu Every new version (except bug-release) is submitted to the info-mac archives at sumex-aim.stanford.edu. (/info-mac/tech/gestalt-list-XX.txt) It is also available on its mirror sites (e.g. in Europe: lth.se). FINGER You can also read this list by using finger to 'rgaros@bio.vu.nl'. Tip: 'finger rgaros@bio.vu.nl | more' or 'finger rgaros@bio.vu.nl > filename' My .plan file that you see when you do this, may be more up-to-date and may include small corrections, or contains a preliminary version of the next version to be published. MAIL LIST Every person on this mail list gets automatically an update by email whenever there are some changes. If you want to join this mail list you need to send me an email asking to be included. The same applies when you want to be removed from the list. This service is only possible to those who have an account on Internet or any other network reachable from Internet. I can not provide mailing of printed versions or on disk by normal surface mail. CONTENTS # Changes # Definitions and Format # Gestalt Selector Codes & Responses = Apple System Software = Apple Additional Software = Third Parties Software # Gestalt Selector Codes, Responses Unknown = Apple System Software = Apple Additional Software = Third Parties Software # Abbreviations # Format version numbers = 4-byte words = BCD = INTEGER # AppleShare File & Print Server selector codes # Glue code # Sources # Related Software # Acknowledgements # Legal Stuff = Notice of Liability = Trademarks = Distribution # Moderator ####Changes (since v1.1) Added selectors Apple System : alis, fxfr, misc, term, Apple Add. : arb Third Parties : CKI3 Added unknown Apple System : OSType(7), OSType(13) Apple Add. : Third Parties : AP17, GtOp, gV00..gV04, LFnt, PBUf, PBUt, RQDC Changed Apple System : atkv, conn, hdwr, mach, ppc , rsrc, tabl Apple Add. : qtim Third Parties : YeHa Previously unknown Apple System : ctbm, ctbu, sccr, sccw, vmbs Apple Add. : strm Third Parties : ApoL (incl. complete description) Added "Glue Code" chapter about selectors 'glue-ed' by programming software, when the Gestalt Manager is not available. (Suggested by Marco Piovanelli). Marco also went hunting for the Gestalt Selector Table and found probably the correct meaning of the 'tabl' selector. Meanwhile he also found two unusual selectors, OSType(7) and OSType(13) ("Charlie's selectors" !? ;-) ) These are listed at the end of unknown Apple System Software selectors. Added "Legal Stuff" chapter (US legal system is famous :-) ). More entries in 'Related software'-chapter, including the location of related New Technical Notes on ftp.apple.com. Selectors 'dict' and 'tsmv' were incorrectly listed as known. Dave Radcliffe (Mac DTS, Author TN Apple) clarified the two contradictions in the previous version. Jeremy Roussak (Author Apollo ext) allowed including the chapter 'Programmers' Information' from the Apollo 1.0 documentation. Victor Tan (Author SpeedyFinder7 cp) provided some remarks about the selector installed by SP7. And yes, when there are more 'Third Party'-selectors they will get their own, separate list. ####Definitions and Format Apple System Software Selectors installed by normal System Software. IM VI: "Apple reserves for its own use all four-character sequences consisting solely of lowercase letters and nonalphabetic ASCII characters". Apple Additional Software Selectors installed by additional software by Apple Inc. See also quote above. Third Parties Software Selectors installed by software from parties other than Apple Inc. IM VI: "If you have registered a creator string with Apple, you are strongly encouraged to use that sequence as your selector code". Format used to display information about selector code: | ****'selector code' (Application [available in version]) | name (description, documentation) OR description | | CONST declaration; {remark} *ref.number to source | | contradiction: | source A says "X" | source B says "Y" If a selector code is installed by Apple software the entry also includes if it is in addition to or not listed in IM VI. The source reference number may also be used in other places than indicated above. It then applies to other parts of then entry. Some constant-names may not originate from official publications. Any response value described is what was found by others or myself on different machine(s) with its configuration. ####Gestalt Selector Codes & Responses ====Apple System Software ****'alis' (System [7.0]) gestaltAliasMgrAttr (addition by AppleTalk Remote Access) gestaltAliasMgrSupportsRemoteAppletalk = 1; {supports Remote Access} *9 See also remarks with 'qtim' selector. ****'atkv' (System [since 7.0, AT 56]) gestaltATalkVersion *4 (not listed) Returns AppleTalk version in 4-byte words. This is different from 'atlk' ! With the release of the System 7 Tuner product, AppleTalk will not be loaded at startup, if prior to the previous shutdown AppleTalk was turned off in the Chooser. Under this circumstance, the 'atkv' selector is not available. If the 'atkv' selector is not available under System 7, this is an indicator that AppleTalk cannot be turned on without doing so in the Chooser and rebooting the system. *4 gestaltATalkVersion = 'atkv'; *3/5 ****'atlk' (System [since 6.0.4]) gestaltAppleTalkVersion (addition) Returns the version of the .MPP driver in INTEGER. LAPMgrExists := (AppleTalkVersion >= 53); *4 ****'conn' (System, CTB installed [since 7.0]) gestaltConnMgrAttr (addition) Under System 6, this Gestalt selector isn't implemented when the Communications Toolbox is installed (Michael Hecht). additional responses exist but unknown (bit 2 & 3). ****'ctbm' (System, CTB installed) gestaltCTBManagersAttr (not listed) Communications Toolbox Managers, bitmask of which managers are present. gestaltCTBManagersAttr = 'ctbm'; *7 ****'ctbu' (System, CTB installed) gestaltCTBUtilsAttr (not listed) Communications Toolbox Utilities Attr gestaltCTBUtilsAttr = 'ctbu'; *7 gestaltCTBUtilsPresent = 0; *7 ****'eajt' (Easy Access cp [since 7.0]) gestaltEasyAccessJTable (not listed) Returns the base address of the Easy Access jump-trap table. gestaltEasyAccessJTable = 'eajt'; *3 ****'flag' (Network Extension ext [since System 7.0 *4]) gestaltFlagshipAttr (not listed) gestaltFlagshipAttr = 'flag'; *3 gestaltFlagshipPresent = 0; *3 gestaltFlagshipRegistered = 1; *3 ****'fpu ' (System [since 6.0.4]) gestaltFPUType (addition) gestal68040FPU = 3; *2 ****'fs ' (System) gestaltFSAttr (addition) gestaltHasFileSystemManager = 2; *2 ****'font' (System [since 7.0]) gestaltFontMgrAttr (addition) additional System 7.1 responses exist but unknown. ****'fxfr' (System [since 7.0]) gestaltFXfrMgrAttr (addition) gestaltFXfrMgrErrorString = 1; *7 ****'hdwr' (System [since 6.0.4]) gestaltHardwareAttr (additions) gestaltHasRBV = 2; {RBV} *3 gestaltHasOSS = 5; {OSS} *3 gestaltHasSCSIDMA = 6; {53C80 SCSI DMA} *3 gestaltHasSWIMIOP = 8; {SWIM IOP} *3 gestaltHasSCCIOP = 9; {SCC IOP} *3 gestaltHasFitch = 10; {Fitch memory Controller} *8 gestaltHasIWM = 11; {IWM} *3 gestaltHasPWM = 12; {PWM disk speed buffer} *8 gestaltHasRAMSndBuff = 13; {RAM-based sound buffer} *8 gestaltHasVideoDAConv = 14; {Video D/A Converter} *8 gestaltHasPGC = 15; {PGC (parity control)} *8 gestaltHasSoftPowerOff = 19; *2 gestaltHasSonic = 20; {Sonic} *3 gestaltHasSCSI961 = 21; {Int. 53C96 SCSI} *1 gestaltHasSCSI962 = 22; {Ext. 53C96 SCSI} *1 gestaltHasDAFBVideo = 23; {DAFB Video} *3 See for more information the TN "M.OV.GestaltSysenvirons". ****'kbd ' (System [since 6.0.4]) gestaltKeyboardType (additions) gestaltPwrBookADBKbd = 12; {PowerBook ADB Keyboard} *1 gestaltPwrBookISOADBKbd = 13; {PowerBook ISO ADB Keyboard} *1 ****'mach' (System [since 6.0.4]) gestaltMachineType (additions) gestaltQuadra900 = 20; {Macintosh Quadra 900} *1 gestaltPowerBook170 = 21; {Macintosh PowerBook 170} *1 gestaltQuadra700 = 22; {Macintosh Quadra 700} *1 gestaltClassicII = 23; {Macintosh Classic II} *1 gestaltPowerBook100 = 24; {Macintosh PowerBook 100} *1 gestaltPowerBook140 = 25; {Macintosh PowerBook 140} *1 gestaltQuadra950 = 26; {Macintosh Quadra 950} *1 gestaltPowerBook210 = 29; {Macintosh PowerBook 210} gestaltPowerBook230 = 32; {Macintosh PowerBook 230} gestaltPowerBook180 = 33; {Macintosh PowerBook 180} gestaltPowerBook160 = 34; {Macintosh PowerBook 160} gestaltMacLCII = 37; {Macintosh LC II} gestaltMacIIvi = 44; {Macintosh IIvi} gestaltPerforma600 = 45; {Macintosh Performa 600} gestaltMacIIvx = 48; {Macintosh IIvx} gestaltPowerBook145 = 54; {Macintosh PowerBook 145} Exceptions with systems prior to System 7.1: gestaltMacLCII = 19; {Macintosh LC & LC II} gestaltPowerBook145 = 25; {Macintosh PowerBook 140 & 145} ****'misc' (System [since 6.0.5]) gestaltMiscAttr (addition) gestaltBootGlobals = 1; {Boot Globals} *8 ****'mmu ' (System [since 6.0.4]) gestaltMMUType (addition) gestalt68040MMU = 4; {68040 built-in} *2 ****'ppc ' (System [since 7.0]) gestaltPPCToolboxAttr (addition) The first thing that is confusing is that, unlike other selectors returning attributes, the responses are not bit values, but bit masks. This means you simply AND the value with the response to test the bit. The second thing that is confusing is how to interpret gestaltPPCToolboxPresent = 0x0000. What this means is that if the PPC toolbox is present, but has not been initialized (by calling PPCInit), then gestaltPPCToolboxAttr returns 0x0000. In reality, PPCInit gets called by the Process Manager before any applications get launched, so no applications will actually see this response. (Dave Radcliffe) gestaltPPCToolboxAttr = 'ppc '; gestaltPPCToolboxPresent = 0x0000, {Requires PPCInit to be called} gestaltPPCSupportsIncoming = 0x0001; {Deny incoming net requests} gestaltPPCSupportsOutGoing = 0x0002; {Deny outgoing net requests} gestaltPPCSupportsRealTime = 0x1000; {Supports real-time delivery} ****'proc' (System [since 6.0.4]) gestaltProcessorType (addition) gestalt68040 = 5; *2 ****'qdrw' (System [since 7.0]) gestaltQuickDrawFeaturesAttr (not listed) There is a bug in the 'qdrw' selector that causes it to report that Color QuickDraw is always present, even on machines that don't support it. Apple has acknowledged this bug on AppleLink. (Chris Wysocki) Use SysEnvirons instead or try this: gHasColorQuickDraw := (Gestalt(gestaltQuickDrawVersion, qdVersion) = noErr) & (qdVersion >= gestaltQuickDraw8Bit); gestaltQuickDrawFeaturesAttr = 'qdrw'; *2 gestaltHasColor = 0; *2 gestaltHasDeepGWorlds = 1; *2 gestaltHasDirectPixMaps = 2; *2 gestaltHasGrayishTextOr = 3; *2] ****'rsrc' (System [should work since 7.0?]) gestaltResourceMgrAttr (addition) Under System 7, bit 0 that tells if you have partial resource support doesn't work right. This selector is undefined under System 7.0 and 7.0.1 even though the partial resource calls are available. (Michael Hecht, Quinn) additional response exist but unknown (bit 1). ****'sccr' (System [6.0.4, discontinued]) gestaltSCCReadPortsAddr (not listed) Returns the address of SCC read ports. gestaltSCCReadPortsAddr = 'sccr'; ****'sccw' (System [6.0.4, discontinued]) gestaltSCCWritePortsAddr (not listed) Returns the address of SCC write ports. gestaltSCCWritePortsAddr = 'sccw'; ****'sysv' (System [since 6.0.4]) gestaltSystemVersion (listed in IM VI; question) Returns the version number of currently active System file in BCD. Is it correct system 6.0.8 returns 0x0607? Can you determine if it is actually 6.0.8 in another way? ****'tabl' (System [since 6.0.4]) gestaltSelectorTable (not listed) Returns a handle to the Gestalt selector table itself. The Gestalt selector table is kept in a resizable block in the system heap. The last item in the table is a dummy entry (INVALID), marked by a selector OSType(MaxLongInt). (Marco Piovanelli, he has also some snippet Pascal code to list all selectors) gestaltSelectorTable = 'tabl'; ****'term' (System [7.1?]) gestaltTermMgrAttr (addition) gestaltTermMgrErrorString = 1; *7 ****'via1' (System [6.0.4, discontinued]) gestaltVIA1Addr (not listed) Returns the address of VIA 1. gestaltVIA1Addr = 'via1'; ****'via2' (System [6.0.4, discontinued]) gestaltVIA2Addr (not listed) Returns the address of VIA 2. gestaltVIA2Addr = 'via1'; ****'vmbs' (System, VM on [since 7.0]) gestaltVMBackingStoreRef (not listed) Returns the ioRefNum of the VM storage file. gestaltVMBackingStoreRef = 'vmbs'; ****'wma.' (System [since 7.0]) gestaltResponderAttr (Workstation Management Agent aka Responder, not listed) gestaltResponderAttr = 'wma.'; gestaltResponderPresent = 0; ****'xttt' (System [since 6.0.8]) gestaltExtToolboxTable (not listed) Returns the base address of the Extended Toolbox trap table. gestaltExtToolboxTable = 'xttt'; ====Apple Additional Software ****'admn' (AppleShare Admin appl [since 3.0]) gestaltASAdminAttr gestaltASAdminAttr = 'admn'; gestaltASAdminPresent = 0; ****'arb ' (AppleTalk Remote Access [1.0]) gestaltArbitorAttr (Serial Port Arbitration) *9 gestaltArbitorAttr = 'arb '; gestaltSerialArbitrationExists = 0; {Serial Port Arbitration installed} ****'asps' (AppleShare Print Server appl [since 3.0]) gestaltASPrintServerAttr gestaltASPrintServerAttr = 'asps'; gestaltASPrintServerPresent = 0; ****'aucd' (Audio CD Access ext [since 4.0]) gestaltAudioCDAccessVersion (CD-ROM Software 4.0) Returns Audio CD Access version in BCD. Version 4.0.1 of the CD-ROM Software will still return 0x0400. gestaltAudioCDAccessVersion = 'aucd'; ****'font' (TrueType INIT for System 6.x) This selector is also installed by the TT INIT. See for details IM VI. ****'hgfd' (AppleShare File Server appl [since 3.0]) gestaltASFileServerAttr gestaltASFileServerAttr = 'hgfd'; gestaltASFileServerPresent = 0; ****'hscd' (High Sierra File Access ext [since 4.0]) gestaltHighSierraFAVersion (CD-ROM Software 4.0) Returns High Sierra File Access version in BCD. Version 4.0.1 of the CD-ROM Software will still return 0x0400. gestaltHighSierraFAVersion = 'hscd'; ****'mtcp' (MacTCP cp [since 1.1]) gestaltMacTCPAttr 0x0000 is returned if MacTCP is present but unopened, *5 0x0001 is returned for MacTCP when it is opened. *5 gestaltMacTCPAttr = 'mtcp'; gestaltMacTCPOpened = 0; *5 I have seen this selector returning 0x0002 on a PB140 with System 7.1, unknown MacTCP version. ****'qtim' (QuickTime ext [since 1.0]) gestaltQuickTimeVersion Returns QuickTime version in 4-byte words. If you install QuickTime under System 6, a major portion of the Alias Manager and FSSpec support is also added. But, QT doesn't implement the Gestalt selectors because the implementation is not complete. You must check for either Alias Mgr or QuickTime. (Michael Hecht) gestaltQuickTimeVersion = 'qtim'; ****'strm' (AppleTalk Remote Access [1.0]) gestaltRemoteAccessAttr *9 gestaltRemoteAccessAttr = 'strm'; gestaltRemoteAccessExists = 0; {RA Connection Interface is available) ****'ufox' (Foreign File Access ext [since 4.0]) gestaltForeignFAVersion (CD-ROM Software 4.0) Returns Foreign File Access version in BCD. Version 4.0.1 of the CD-ROM Software will still return 0x0400. gestaltForeignFAVersion = 'ufox'; ====Third Parties Software ****'ApoL' (Apollo ext [since 1.0]) gestaltApolloTable Returns a handle to an instance of the following structure (described in C): struct { long version; // same as first 4 bytes of 'vers' resource short attr; // attribute bits Boolean (*Control)(Boolean) // control function }; See for more information the Programmers' Information chapter in the Apollo 1.0 documentation. (Jeremy Roussak) gestaltApolloTable = 'ApoL'; ****'CKI3' (AETracker cp [since 3.0]) gestaltAETrackerAddr This selector returns a pointer to the external interface routine for AETracker, details of which are in the AETracker interface guide. (C.K. Haun) gestaltAETrackerAddr = 'CKI3'; ****'SLip' (StuffIt SpaceSaver ext) gestaltSItSpaceSaverAddr Returns the address of the SpaceSaver "command module" which allows developers to access all the functions of SS. (Leonard Rosenthol) gestaltSItSpaceSaverAddr = 'SLip'; ####Gestalt Selector Codes, Responses Unknown ====Apple System Software ****'BSDa' (CloseView cp) (developed by Berkeley Systems, Inc.) ****'bugz' (System (Tuna Helper INIT rsrc) [since 7.0]/Tune-up ext) IIx (701/111): $02f7f33f, PB140 (71): $1ffffaff ****'dict' (System [since 7.1]) gestaltDictionaryMgrAttr/Version? (Dictionary Manager, not listed) gestaltDictionaryMgr??? = 'dict'; PB140 (71): $00000001 ****'icon' (System? [?]) Icon Utilities Attr? ****'nubs' (System [6.0.4, 6.0.5, 6.0.7, discontinued]) gestaltNuBusCount? Returns count of NuBus slots? Plus: $00000000, IIx: $00000006 ****'rbv ' (System [6.0.4, discontinued]) Plus: $00000000, IIx: - (Installed but unknown response on MacIIx) ****'slot' (System [6.0.4, 6.0.5, discontinued]) Plus: $00000000, IIx: $00000003 ****'slt1' (System [6.0.4, 6.0.5, discontinued]) Returns first slot# in hexadecimal? Plus: -, IIx: $00000009 (Installed but unknown response on MacPlus) ****'tsmv' (System [since 7.1]) gestaltTextServicesMgrVersion? (not listed) gestaltTextServicesMgrVersion = 'tsmv'; new System 7.1 response exists but unknown ****'vmcl' (System, VM on [since 7.0]) ****OSType(7) (System [since 6.0.4]) Returns LongInt('carl') and a result code of noErr. ****OSType(13) (System [since 6.0.4]) Returns LongInt('bbmc') and a result code of noErr. ====Apple Additional Software ****'cpnt' (QuickTime ext [since 1.0]) gestaltComponentMgrAttr/Version? (Component Manager) gestaltComponentMgr??? = 'cpnt'; gestaltComponentMgrPresent = 0; (guess) ****'icmp' (QuickTime ext [since 1.0]) gestaltCompressionMgrAttr (ImageCompression Manager) *6 gestaltCompressionMgrAttr = 'icmp'; *6 ****'kpcd' (Apple Photo Access ext [since 1.0]) gestaltApplePhotoAccess??? (CD-ROM Software 4.0) Response unknown ($fffffff7). gestaltApplePhotoAccess??? = 'kpcd'; ****'slnk' (AppleTalk Remote Access MNPlink? [1.0]) ====Third Parties Software Especially the Third Party selectors may change with every new release and are therefore only listed in the 'known selectors' chapter when the author has described the structure in the documentation or by mail to me. ****'AP17' (?) ****'AzNe' (NameView cp) ****'ESOC' (Serial of Champions ext) ****'GtOp' (?) ****'gV00', 'gV01', 'gV02', 'gV03', 'gV04' (PowerPort cp???) ****'He20' (Helium cp) ****'Intj' (Interjection ext) ****'LFnt' (Dialog View cp, formerly List Font cp) ****'MV10' (TearOFF cp) ****'NMBT' (Attention cp [since 0.6]) ****'PBUf' (?) ****'PBUt' (?) ****'RQDC' (DropCheck cp) ****'YeHa' (SpeedyFinder7 cp) The structure to which the _Gestalt selector refers changes almost invariably from version to version of SF7. Should someone work out parts of the structure of the selector keep in mind that it will almost certainly change in the next minor release and definitley with the next major release. (Victor Tan) ####Abbreviations ADB - Apple Desktop Bus AS - AppleShare ASC - Apple Sound Chip CPU - Central Processing Unit DAFB - ??? DMA - Direct Memory Access DN - Developer Note FPU - Floating Point Unit IM - Inside Macintosh (old volumes I-VI) IOP - Input/Output Processor IWM - Integrated Woz Machine MMU - Memory Management Unit NIM - New Inside Macintosh OSS - ??? PGC - ??? PPC - Process-to-Process Communication PWM - ??? RBV - RAM-Based Video SCC - Serial Communications Controller SCSI - Small Computer System Interface SIMM - Single In-line Memory Module Sonic - ??? SWIM - Super Integrated Woz Machine? TN - Technical Note VIA - Versatile Interface Adapter VM - Virtual Memory appl - application cp - control panel ext - extension FA - File Access RA - Remote Access ####Format version numbers ====4-byte words The format of the LONGINT result is as follows: (based on posting by Ivan M Cavero Belaunde) MMmbSSss (e.g. 01524050) Where: MM is major revision release in BCD 1 m is minor revision release in BCD 5 b is bug fix release in BCD 2 SS is development stage b (dev=10,alpha=20,beta=40,release=80) ss is dev. stage # in BCD 50 ------- + 1.5.2b50 :-) The 'atkv' selector returns the major revision release in hexadecimal. ====BCD (Binary Coded Decimal) 0x0400 means 4.0.0 (MMmb, see above) ====INTEGER The decimal representation of the returned value is the version. ####AppleShare File & Print Server selector codes The selectors are defined when the application has run. If it is still running (or wasn't properly quit) the response is one. When the application has properly quit the response is zero. 'admn' AppleShare Admin 'asps' AppleShare Print Server 'hgfd' AppleShare File Server ####Glue code The following programming software includes glue-code to return some responses even if the Gestalt Manager is not available. Every entry includes the selectors of which the Glue-code can return a response. ****Symantec THINK Pascal [at least since 4.0.1]: atlk, fpu , kbd , kbd , lram, mach, mmu , qd , ram , sysv, vers ####Sources *1 Apple Inc.; TN M.OV.GestaltSysenvirons, May 1987, rev. Sep. 1992 *2 Symantec Corp.; THINK Pascal 4.0.1 *3 Carl C.Hewitt; Gestalt DA 1990 *4 Apple Inc.; TN M.NW.AppleTalk2, Feb. 1992, rev. Sep. 1992 *5 Apple Inc.; MacTCP 1.1 Programmer's Guide. *6 Apple Inc.; QuickTime ImageCompression source files (with QT 1.0) *7 Symantec Corp.; Think C GestaltGlue source files *8 Eric Simenel, Apple Computer France; Gestalt dcmd 1.0 *9 Apple Inc.; AppleTalk Remote Access API External Reference Specification ####Related Software ****AEgestalt Uses Apple Events to get Gestalt response from remote machine, includes C-source. (Requires color?? Doesn't want to run on MacPlus) FTP: bric-a-brac.apple.com /dts/mac/sc/snippets/platforms.tools/aegestalt-1-0.hqx ****Gestalt DCMD This dcmd (debugger command for MacsBug) allows you to "use" Gestalt when you're in MacsBug. FTP: bric-a-brac.apple.com /dts/mac/sc/snippets/platforms.tools/gestalt-dcmd.hqx ****DisplayGestalt Small application displays configuration using Gestalt Mgr, includes C-source. FTP: mac.archive.umich.edu /development/libraries/displaygestalt.cpt.hqx ****Gestalt! Displays responses from know installed selectors. FTP: ftp.lu.se /pub/mac/util/Gestalt!_X.X.X.cpt.hqx /pub/mac/util/Gestalt!_X.X.X.cpt.hqx.txt ****GestaltDA Displays responses from installed selectors. ****GestaltExt External for 4TH Dimension Relational Database application from ACI/ACIUS. FTP: ftp.scri.fsu.edu /pub/4d/4d-GestaltExt.external.hqx ****GestaltGlue Glue code in C. FTP: ics.uci.edu /mac/think-c/symantec/pre-5.0stuff/gestalt.hqx ****Technical Notes 'M.OV.GestaltSysenvirons' and 'M.NW.AppleTalk2' M.OV.GestaltSysenvirons discusses Gestalt and SysEnvirons M.NW.AppleTalk2 discusses AppleTalk FTP: bric-a-brac.apple.com /dts/mac/tn/overview/gestalt-and-system-environs.hqx /dts/mac/tn/networking/appletalk2.hqx ****Test Gestalt Examples to test for QuickDraw version and Virtual Memory status, includes C-source. FTP: bric-a-brac.apple.com /dts/mac/sc/snippets/toolbox/testgestalt.hqx ####Acknowledgements I want to thank the following persons for their contribution to this list: C.K. Haun (Author AETracker cp) Chris Wysocki Dave Radcliffe (Author TN GestaltSysenvirons) Ivan M Cavero Belaunde Jeremy Roussak (Author Apollo ext) Jon Watte Lawrence D'Oliveiro Leonard Rosenthol Marco Piovanelli Mark B. Johnson Michael Hecht Pete Resnick Quinn Robert Hess Roland Mansson (Author Gestalt! appl) Victor Tan (Author SpeedyFinder7 cp) and the Computer Department at the Biology Faculty of the Free University in Amsterdam (The Netherlands) for their help and support. These persons provided information used in this list. They did this on personal title, NOT on behalf of their employer. I assume information you mail to me about Gestalt selectors may be used in this list. Information made available to the general public (e.g. a posting to a USENET newsgroup) is also included and the persons name added to this chapter (and to the mail list). I will mail you back to thank you and include the parts from the list which, according the information you provided, were changed to let you check them. BTW Persons are only listed with any software they wrote when these are mentioned somewhere in this list. ####Legal Stuff ====Notice of Liability The information in this list is distributed on a "AS IS" basis, without warranty. While every precaution has been taken in the preparation of this list, neither the moderator nor any contributor shall have any liability to any person or entity with respect to any liability, loss, or damage caused or alleged to be caused directly or indirectly by the information contained in this list or by the computer software and hardware products described herein. ====Trademarks Throughout this list trademarked names are used. Rather than put a trademark symbol in every occurrence of a trademarked name, I state I am using the names only in an editorial fashion and to the benefit of the trademark owner with no intention of infringement of the trademark. ====Distribution The information in this list may be used freely for NON-COMMERCIAL purposes only. If you DO USE the information in this list for COMMERCIAL purposes, you may consider sending the moderator a donation. If you (start to) redistribute this list outside Internet (especially printed, on disk or CD-ROM) you are kindly asked to notify the moderator. You are not allowed to distribute modified versions of this list, including, but not limited to, deleting, adding or moving text or adding non-text parts. Distribution in any electronical format except a normal text file is not allowed without permission. You are not allowed to redistribute it with any other name than 'gestalt-list-XX.txt' (where XX is the version number) unless because of technical reasons. ####Moderator Rene G.A. Ros (student Computer Science) D.C. van Krimpenstraat 3 1067 SG Amsterdam The Netherlands, Europe Bank : Postbank 4762669 Phone# : +31 20 611 92 74 / +31 20 611 87 00 Fax# : +31 20 611 60 06 Internet : rgaros@bio.vu.nl rgaros@nikhefk.nikhef.nl rener@htsa.aha.nl (you can send a carbon copy of urgent messages to this address) CompuServe: 100112,1363 (not preferred) >INTERNET: rgaros@bio.vu.nl --------------------------- End of C.S.M.P. Digest **********************